package com.codahale.metrics.sigar.rmi;

import org.hyperic.sigar.CpuPerc;
import org.hyperic.sigar.FileSystem;
import org.hyperic.sigar.FileSystemUsage;
import org.hyperic.sigar.Mem;
import org.hyperic.sigar.NetInterfaceConfig;
import org.hyperic.sigar.NetInterfaceStat;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;

import kamon.sigar.SigarProvisioner;

public class SystemRuntime {
	
	private Sigar sigar = null;

	public void update() throws Exception {
		SigarProvisioner.provision();
		sigar = new Sigar();
	}

	public SystemRuntime() throws Exception {
		SigarProvisioner.provision();
		sigar = new Sigar();
	}

	public Mem memory() throws SigarException {
		Mem mem = sigar.getMem();
		// // 内存总量
		// System.out.println("内存总量: " + mem.getTotal() / 1024L + "K av");
		// // 当前内存使用量
		// System.out.println("当前内存使用量: " + mem.getUsed() / 1024L + "K used");
		// // 当前内存剩余量
		// System.out.println("当前内存剩余量: " + mem.getFree() / 1024L + "K free");
		return mem;
	}

	public CpuPerc cpu() throws SigarException {
		CpuPerc perc = sigar.getCpuPerc();
		// System.out.println("整体cpu的占用情况:");
		// System.out.println("空闲率: " +
		// CpuPerc.format(perc.getIdle()));//获取当前cpu的空闲率
		// System.out.println("占用率: "+
		// CpuPerc.format(perc.getCombined()));//获取当前cpu的占用率
		return perc;
	}

	public void file() throws Exception {
		FileSystem fslist[] = sigar.getFileSystemList();
		for (int i = 0; i < fslist.length; i++) {
			System.out.println("分区的盘符名称" + i);
			FileSystem fs = fslist[i];
			// 分区的盘符名称
			System.out.println("盘符名称:    " + fs.getDevName());
			// 分区的盘符名称
			System.out.println("盘符路径:    " + fs.getDirName());
			System.out.println("盘符标志:    " + fs.getFlags());//
			// 文件系统类型，比如 FAT32、NTFS
			System.out.println("盘符类型:    " + fs.getSysTypeName());
			// 文件系统类型名，比如本地硬盘、光驱、网络文件系统等
			System.out.println("盘符类型名:    " + fs.getTypeName());
			// 文件系统类型
			System.out.println("盘符文件系统类型:    " + fs.getType());
			FileSystemUsage usage = null;
			usage = sigar.getFileSystemUsage(fs.getDirName());
			System.out.println(fs.getDevName() + "读出：    " + usage.getDiskReads());
			System.out.println(fs.getDevName() + "写入：    " + usage.getDiskWrites());
		}
		return;
	}

	public float[] net(String ip) throws Exception {
		float[] result = { 0f, 0f };
		if (netBytes(ip) == null){
			return result;
		}
		update();
		long time = System.currentTimeMillis();
		long rx = netBytes(ip).getRxBytes();
		long tx = netBytes(ip).getTxBytes();
		Thread.sleep(500);
		update();
		time = System.currentTimeMillis() - time;
		rx = netBytes(ip).getRxBytes() - rx;
		tx = netBytes(ip).getTxBytes() - tx;
		result[0] = rx * 1f / time;// kb/sec
		result[1] = tx * 1f / time;
		return result;
	}

	public NetInterfaceStat netBytes(String ip) throws Exception {
		String ifNames[] = sigar.getNetInterfaceList();
		NetInterfaceStat result = null;
		for (int i = 0; i < ifNames.length; i++) {
			String name = ifNames[i];
			NetInterfaceConfig ifconfig = sigar.getNetInterfaceConfig(name);
			if (ifconfig.getAddress().equals(ip)) {
				result = sigar.getNetInterfaceStat(name);
				break;
			}
			// System.out.println("网络设备名: " + name);// 网络设备名
			// System.out.println("IP地址: " + ifconfig.getAddress());// IP地址
			// System.out.println("子网掩码: " + ifconfig.getNetmask());// 子网掩码
			// if ((ifconfig.getFlags() & 1L) <= 0L) {
			// System.out.println("!IFF_UP...skipping getNetInterfaceStat");
			// continue;
			// }
			// NetInterfaceStat ifstat = sigar.getNetInterfaceStat(name);
			//
			// System.out.println(name + "接收的总包裹数:" + ifstat.getRxPackets());//
			// 接收的总包裹数
			// System.out.println(name + "发送的总包裹数:" + ifstat.getTxPackets());//
			// 发送的总包裹数
			// System.out.println(name + "接收到的总字节数:" + ifstat.getRxBytes());//
			// 接收到的总字节数
			// System.out.println(name + "发送的总字节数:" + ifstat.getTxBytes());//
			// 发送的总字节数
			// System.out.println(name + "接收到的错误包数:" + ifstat.getRxErrors());//
			// 接收到的错误包数
			// System.out.println(name + "发送数据包时的错误数:" +
			// ifstat.getTxErrors());// 发送数据包时的错误数
			// System.out.println(name + "接收时丢弃的包数:" + ifstat.getRxDropped());//
			// 接收时丢弃的包数
			// System.out.println(name + "发送时丢弃的包数:" + ifstat.getTxDropped());//
			// 发送时丢弃的包数
		}
		return result;
	}
}